Curso de ScriptVox Intermedirio - Aula 6 - Prof. Oswaldo Vernet - iNCE/UFRJ

Na aula anterior, examinamos algumas novidades introduzidas na verso 6.0 do 
interpretador Scriptvox para manipulao de cadeias de caracteres.

Nesta sexta aula, daremos continuidade ao estudo de cadeias, abordando mais
alguns aspectos.

Antes de ler o texto, baixe a nova verso do interpretador, que sofreu pequenas 
modificaes, e utilize-a para acompanhar os exemplos.

O comando COPIA foi mencionado na aula anterior para ilustrar como os scripts
podiam obter o caractere armazenado numa certa posio em uma cadeia. Vimos
que, com a INDEXAO, isto era possvel em expresses, sem necessidade de usar
o comando COPIA. Assim, a atribuio:

c := frase[3]

armazena na varivel "c" o terceiro caractere da cadeia armazenada na varivel
frase. 

Entretanto, o comando COPIA nos permite extrair no apenas um nico caractere
de uma posio da cadeia, mas tambm a subcadeia comeando em uma certa posio
e terminando em outra. Por exemplo, supondo que a varivel "frase" armazene uma
cadeia de caracteres o comando

copia x frase 3 7

armazena na varivel "x" a subcadeia de frase que comea na segunda posio e
vai at a stima, inclusive. Isto quer dizer que os caracteres das posies
3, 4, 5, 6 e 7 sero copiados para uma cadeia, que ser armazenada
na varivel "x". Execute, no novo interpretador, o seguinte exemplo: 

frase := "o cravo brigou com a rosa"
copia x frase 3 7
escreve x

e confira o valor da varivel "x" que  escrito na tela. 

Como reproduzir este efeito utilizando a indexao?   simples: entre colchetes,
colocamos a posio inicial seguida de duas vezes o caractere ponto (um colado no
outro) seguido da posio final. Usando, ento, este mesmo exemplo, o comando 
"copia" seria substitudo pela seguinte atribuio:

x := frase[3 .. 7]

Os dois caracteres ponto seguidos devem aparecer juntos, no podendo haver branco 
entre eles.

Desta maneira, em vez de especificarmos uma nica posio, especificamos uma
FAIXA, que comea em uma certa posio e termina em outra.

Da mesma forma que conseguimos obter a subcadeia compreendida em uma faixa de
posies, podemos tambm modific-la, substituindo-a por outra cadeia. 
Execute o pequeno script a seguir no novo interpretador e observe o que ser
escrito na tela:

frase := "o cravo brigou com a rosa"
frase[3 .. 7] := "coqueiro"
escreve frase

Percebeu o que aconteceu? A faixa de posies de 3 a 7 continha a subcadeia
"cravo" antes da segunda atribuio. O que esta atribuio fez foi trocar esta
subcadeia pela cadeia "coqueiro".

E se desejarmos apagar uma subcadeia, conhecidas a suas posies inicial e
final, como procedemos?  Basta substitu-la pela cadeia vazia. Continuando
o exemplo, se acrescentarmos a atribuio

frase[12 .. 18] := ""

qual seria o contedo final da varivel "frase"?  Execute no novo interpretador
e descubra.

A indexao por faixas permite obter ou modificar posies consecutivas em
uma cadeia. Nestes exemplos, usamos posies numricas fixas, mas nada 
nos impede de especificar uma faixa em que as posies inicial e final sejam 
expresses, desde que os valores resultantes sejam inteiros. Por exemplo, se
desejarmos obter a subcadeia que comea na posio 5 e se estende at o final
da cadeia armazenada na varivel exemplo, podemos usar a seguinte construo:

x := exemplo[5 .. TAMANHO(exemplo)]

Percebeu o que fizemos? A posio final especificada na faixa , na verdade, o
valor de retorno da funo TAMANHO aplicada  prpria cadeia exemplo, que nos
d, exatamente, a ltima posio da cadeia.

Voc certamente se lembra de um poderoso comando em ScriptVox: o comando SUBSTITUI.
Ele troca, em uma cadeia, todas as ocorrncias de um padro por uma outra cadeia.
Este comando, assim como o comando copia, continua disponvel na verso 6.0 por uma
questo de compatibilidade, mas ambos poderiam ter sido excludos, j que  possvel
conseguir o mesmo efeito sem utiliz-los.

Suponhamos que a varivel "texto" armazene uma cadeia e que a varivel "padro" armazene 
um padro simples (ou seja, uma cadeia a ser procurada). Desejamos verificar se "padro" 
 uma subcadeia de "texto" e, se for, queremos troc-la pela cadeia armazenada na varivel 
"substituta". Os dois comandos seguintes implementam esta ideia, sem usar o comando SUBSTITUI:

p := POS (padro, texto)
se p > 0 ento texto[p .. p+TAMANHO(padro)-1] := substituta

Analise com cuidado a faixa que foi usada na indexao: ela comea na posio "p"
(que guarda o retorno da funo POS, ou seja, a posio onde comea o padro) e vai at
a posio

p + TAMANHO(padro) - 1

que  exatamente onde termina o padro. Mas observe que s fazemos a troca se "p" for
maior que zero, j que o valor zero indica que "padro" no ocorre em "texto".

No entanto, o comando SUBSTITUI faria mais do que isto. O que ficou faltando?  
Com estes dois comandos, estamos trocando apenas a primeira ocorrncia de padro em texto.
Para ter o mesmo efeito do comando substitui, deveramos processar as demais ocorrncias,
caso existam. 


EXERCCIOS

Exerccio de avaliao (enviar para scriptvox@gmail.com at o meio-dia de 6 de fevereiro de 2012)

Muitas vezes, precisamos processar um arquivo substituindo um certo padro de caracteres
por outro, em todas as linhas, guardando o resultado em outro arquivo.

Sua tarefa ser produzir um script que implementa esta ideia, mas SEM USAR O COMANDO SUBSTITUI. 
Organize-o assim:

- No programa principal, pergunte ao usurio o nome do arquivo a ser processado, o nome do
  arquivo que guardar a resposta, o padro a ser procurado e a cadeia substituta, armazenando
  as respostas em quatro variveis. Depois das quatro perguntas, chame a funo "trocapadro", 
  passando como parmetros os dois nomes lidos, o padro e a cadeia substituta.
  Portanto, a funo receber, ao todo, quatro parmetros.
  
- A funo "trocapadro" dever abrir (e, no final, fechar) os dois arquivos e realizar todo
  o processamento de substituio. NO USE variveis globais NEM o comando DESVIA. 
  USE variveis locais e o comando ENQUANTO. A funo "trocapadro" no retorna nenhum valor.
  
- O programa principal dever ocupar o incio do script e a funo "trocapadro" dever estar
  no final do script.
  
Recordando: esto proibidos, neste exerccio, os comandos DESVIA e SUBSTITUI. Tambm  proibido
a funo "trocapadro" usar variveis globais.

Para testar o seu script, utilize a engenhosa letra do samba "TIPO ZERO", de Noel Rosa,
dada a seguir:

Voc  um tipo que no tem tipo
Com todo tipo voc se parece
E sendo um tipo que assimila tanto tipo
Passou a ser um tipo que ningum esquece
Tipo zero no tem tipo
Voc  um tipo que no tem tipo
Com todo tipo voc se parece
E sendo um tipo que assimila tanto tipo
Passou a ser um tipo que ningum esquece
Quando voc penetra no salo
E se mistura com a multido
Esse seu tipo  logo observado
E admirado todo mundo fica
E o seu tipo no se classifica
E voc passa a ser um tipo desclassificado.

Seu teste, obviamente, ser trocar o padro "tipo" por outra coisa qualquer.

    
Bom estudo!

Oswaldo Vernet







